/**
 * @author Q
 * @create 2025-07-11-19:17
 */

/**
 * 9.⾃动化测试常⽤函数
 *      1.元素的定位
 *      2.操作测试对象
 *      3.窗口
 *      4.等待
 *      5.浏览器导航
 *      6.弹窗
 *      7.文件上传
 *      8.浏览器参数设置
 */
public class Test {
    public static void main(String[] args) {
        /**
         * 8.浏览器参数设置
         *      1.无头模式：不显示使用浏览器，只在后台调用，最终返回结果
         *          options.addArguments("-headless")
         *      2.设置浏览器加载策略（推荐12，不推荐3）
         *          1.默认值，等待所有资源加载完
         *          options.setPageLoadStrategy(PageLoadStrategy.NORMAL)
         *          2.DOM访问就绪，但如图像等大资源还没有加载完
         *          options.setPageLoadStrategy(PageLoadStrategy.EAGER)
         *          3.完全不会阻塞WebDriver(太快会报错)
         *          options.setPageLoadStrategy(PageLoadStrategy.NONe)
         */
    }
    public static void main7(String[] args) {
        /**
         * 7.文件上传
         *      使用sendKeys将文件路径作为其函数参数，相当于上传了文件给浏览器
         */
    }
    public static void main6(String[] args) {
        /**
         * 6.弹窗（根据需求使用alert调用相应弹窗）
         *      1.警告弹窗+确认弹窗
         *          处理方法：（如果不处理，无法选择页面元素）
         *              1.调用弹出弹窗
         *              2.切换到弹窗
         *              Alert alert = driver.switchTo.alert();
         *              3.点击确认/取消
         *                  alert.accept()
         *                  alert.dismiss()
         *      2.提示弹窗
         *      Alert alert = driver.switchTo.alert();
         *      alert.sendKeys(输入文字)
         *      alert.accept()
         *      alert.dismiss()
         */
    }
    public static void main5(String[] args) {
        /**
         * 5.浏览器导航
         *      1.打开网站
         *          driver.get("网址");
         *      2.浏览器的前进、后退、刷新
         *           driver.navigate().forward();
         *           driver.navigate()back();
         *           driver.navigate().refresh();
         */
    }
    public static void main4(String[] args) {
        /**
         * 4.等待
         *      1.强制等待（用于调试）
         *          Thread.sleep();
         *          优点：使用简单，易于理解
         *          缺点：极大增加的自动化执行时间
         *      2.隐式等待：在规定时间内不断查找元素，如果时间到了没查找到则报错
         *          implicitlyWait（） 参数：Duration类中提供的毫秒、秒、分钟等⽅法
         *          优点：智能等待，作用域全局
         *          缺点：只能查找元素
         *      3.显示等待：设置判断条件在规定时间内查找元素
         *          优点：显⽰等待是智能等待，可以⾃定义显⽰等待的条件，操作灵活
         *          缺点：写法复杂
         *      4.显示等待和隐式等待同时设置，是否会同时发生（所用时间不可预测）
         *          注意使用
         */
        /**
         * 运行程序报错，发生找不到对象问题解决
         *      1.找不到选择器选择对象
         *          1.静态
         *              选择错误/没有切换句柄...
         *          2.动态
         *              如果对象会发生变化，则选择对象上一级标签，然后锁定下一级标签，而不是通过选择器直接选择
         *      2.找的到选择器选择对象
         *          程序运行过快，页面还来不及渲染，就结束了，所以报错
         */
    }
    public static void main3(String[] args) {
        /**
         * 3.窗口
         *      1.切换窗口
         *          1.获取句柄：driver.getWindowHandle()
         *          2.获取全部页面句柄：driver.getWindowHandles()
         *          3.切换句柄为最新页面：driver.switchTo().window(新句柄)
         *      2.窗口设置大小
         *          1.窗口的大小设置
         *      3.窗口切换
         *      4.屏幕截图
         *         初阶（会被覆盖）
         *              1.导入xml
         *              2.将驱动对象强转为TakesScreenshot执行函数方法
         *              3.使用copyFile，指定截图存储位置
         *          高阶(要精确到毫秒，防止覆盖)
         *              1.设置image里面文件夹格式，年月日划分
         *              2.设置image里面文件夹里面内容格式，时间划分
         *              3.使用format方法获取文件名format(System.currentTimeMillis())
         *              4.指定存放路径，"./src/test/image/" + dirTime + "/" + str + "-" + fileTime + ".png";
         *              5.截图，并放入指定路径中FileUtils.copyFile(srcfile,new File(filename));
         *      5.关闭窗口：关闭一个窗口后，要切换句柄，否则还会停留在关闭的页面
         *          关闭当前窗口
         *          driver.close()
         */
    }
    public static void main2(String[] args) {
        /**
         * 2.操作测试对象（需要先找到元素位置）
         *      1.点击/提交对象（绝大多数元素都可以点击）
         *          click()
         *      2.模拟键盘输入
         *          sendKeys("")
         *      3.清除文本内容：同一个情况下，不清除内容会进行拼接
         *          clear()
         *      4.获取文本信息
         *          getText()
         *      5. 获取当前⻚⾯标题
         *          getTitle()
         *      6. 获取当前⻚⾯URL
         *          getCurrentUrl()
         */
    }
    public static void main1(String[] args) {
        /**
         * 1.元素的定位(注意：页面状态必须一样，包括是否登录情况)
         *      1.cssSelector：选中页面中指定的标签元素
         *          常见语法：
         *      2.xpath：xpath使⽤路径表达式来选择xml⽂档中的节点
         *          常见语法：
         *              1 获取HTML⻚⾯所有的节点
         *                  //*
         *              2 获取HTML⻚⾯指定的节点
         *                  //[指定节点]
         *                  //ul ：获取HTML⻚⾯所有的ul节点
         *                  //input：获取HTML⻚⾯所有的input节点
         *              3 获取⼀个节点中的直接⼦节点
         *                  /
         *                  //span/input
         *              4 获取⼀个节点的⽗节点
         *                  ..
         *                  //input/.. 获取input节点的⽗节点
         *              5 实现节点属性的匹配（重要）
         *                  [@...]
         *                  //*[@id='kw'] 匹配HTML⻚⾯中id属性为kw的节点
         *              6 使⽤指定索引的⽅式获取对应的节点内容
         *                  注意：xpath的索引是从1开始的。
         *                  百度⾸⻚通过：//div/ul/li[3] 定位到第三个百度热搜标签
         */
    }
}
